home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
011-020
/
amok11
/
r.o.m.
/
m2sources
/
makemenu.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
6KB
|
204 lines
IMPLEMENTATION MODULE MakeMenu;
(*
Created: 1987
Changed: 1.8.88 by
Stefan Salewski
Stolper Weg 3
2160 Stade West-Germany
Tel: 04141/61130
Note: compiled with AMIGA Modula-2 System by AMSoft from 5.5.88
This Module may be freely copied. But please
leave my name in. Thanks....Stefan
*)
FROM Preference IMPORT CharSize;
FROM SYSTEM IMPORT ADR,ADDRESS,BYTE,BITSET,LONGSET;
FROM Graphics IMPORT jam1,jam2,DrawModeSet;
FROM Exec IMPORT CopyMem,MemReqs,MemReqSet;
FROM Intuition IMPORT MenuPtr,MenuItemPtr,MenuItemFlagSet,checkWidth,
commWidth,menuEnabled,MenuItemFlags,IntuiTextPtr,WindowPtr;
FROM MyRemember IMPORT AllocRemember,FreeRemember,RememberNodePtr;
(* TYPE
Menunummer=INTEGER[0..MaxAnzahlMenus-1];
Itemnummer=INTEGER[0..MaxAnzahlItems-1];
Subitemnummer=INTEGER[0..MaxAnzahlSubitems-1];
!!!!!!!Integer hat keine Wirkung,deshalb -1.. (CompilerFehler) !!!!!
*)
TYPE
Menunummer=[-1..MaxAnzahlMenus-1];
Itemnummer=[-1..MaxAnzahlItems-1];
Subitemnummer=[-1..MaxAnzahlSubitems-1];
VAR
charWidth,charHeight:INTEGER;
(*************************************************************************)
PROCEDURE InitMenu(VAR mRcs:ARRAY OF MenuRecord;VAR firstMenu:MenuPtr;
VAR remKey:RememberNodePtr);
VAR
menuPtr1,menuPtr2:MenuPtr;
firstItemPtr:MenuItemPtr;
intuTextPtr:IntuiTextPtr;
j:Menunummer;
PROCEDURE InitItems(VAR firstItem:MenuItemPtr);
VAR(*InitItems*)
itemPtr1,itemPtr2,firstSubitemPtr:MenuItemPtr;
i:Itemnummer;
PROCEDURE InitSubitems(VAR firstSubitem:MenuItemPtr);
VAR
subItemPtr1,subItemPtr2:MenuItemPtr;
m:Subitemnummer;
BEGIN
IF mRcs[j].mItems[i].anzahlSubitems > 0 THEN
AllocRemember(remKey,subItemPtr1,SIZE(subItemPtr1^))
ELSE
subItemPtr1:=NIL
END;
firstSubitem:=subItemPtr1;
FOR m:=0 TO mRcs[j].mItems[i].anzahlSubitems-1 DO
IF m < mRcs[j].mItems[i].anzahlSubitems-1 THEN
AllocRemember(remKey,subItemPtr2,SIZE(subItemPtr2^));
subItemPtr1^.nextItem:=subItemPtr2
ELSE
subItemPtr1^.nextItem:=NIL
END;
WITH subItemPtr1^ DO
leftEdge:=ItemnamenLaenge*charWidth;
topEdge:=m*(charHeight+2);
width:=(SubitemnamenLaenge+1)*charWidth+checkWidth+commWidth;
height:=(charHeight+2);
flags:=MenuItemFlagSet{itemText,itemEnabled,checkIt,highComp};
IF m=0 THEN INCL(flags,checked);END;
mutualExclude:=LONGSET{0..31}-LONGSET{(m)};
AllocRemember(remKey,intuTextPtr,SIZE(intuTextPtr^));
itemFill:=intuTextPtr;
selectFill:=NIL;
command:=mRcs[j].mItems[i].subrecords[m].commandKey;
IF command#0C THEN
flags:=flags+MenuItemFlagSet{commSeq}
END;
subItem:=NIL;
nextSelect:=0;
END;
WITH intuTextPtr^ DO
frontPen:=0;
backPen:=1;
drawMode:=jam2;
leftEdge:=checkWidth;
topEdge:=1;
iTextFont:=NIL;
nextText:=NIL;
AllocRemember(remKey,iText,SIZE(Subitemname));
CopyMem(ADR (mRcs[j].mItems[i].subrecords[m].subName),iText,
SIZE(Subitemname));
END;
subItemPtr1:=subItemPtr2;
END;(*FOR*)
END InitSubitems;
BEGIN (*InitItems*)
IF mRcs[j].anzahlItems > 0 THEN
AllocRemember(remKey,itemPtr1,SIZE(itemPtr1^))
ELSE
itemPtr1:=NIL
END;
firstItem:=itemPtr1;
FOR i:=0 TO mRcs[j].anzahlItems-1 DO
InitSubitems(firstSubitemPtr);
WITH itemPtr1^ DO
IF i < mRcs[j].anzahlItems-1 THEN
AllocRemember(remKey,itemPtr2,SIZE(itemPtr2^));
nextItem:=itemPtr2
ELSE
nextItem:=NIL
END;
leftEdge:=0;
topEdge:=i*(charHeight+2);
width:=(ItemnamenLaenge+1)*charWidth+commWidth;
height:=(charHeight+2);
flags:=MenuItemFlagSet{itemText,itemEnabled,highComp};
mutualExclude:=LONGSET{};
AllocRemember(remKey,intuTextPtr,SIZE(intuTextPtr^));
itemFill:=intuTextPtr;
selectFill:=NIL;
IF mRcs[j].mItems[i].anzahlSubitems=0 THEN
command:=mRcs[j].mItems[i].commandKey;
subItem:=NIL;
IF command#0C THEN
INCL(flags,commSeq)
END;
ELSE
subItem:= firstSubitemPtr;
command:=0C
END;
nextSelect:=0;
END;
WITH intuTextPtr^ DO
frontPen:=0;
backPen:=1;
drawMode:=jam2;
leftEdge:=0;
topEdge:=1;
iTextFont:=NIL;
nextText:=NIL;
AllocRemember(remKey,iText,SIZE(Itemname));
CopyMem(ADR (mRcs[j].mItems[i].iname),iText,SIZE(Itemname));
END;
itemPtr1:=itemPtr2;
END;(*FOR*)
END InitItems;
BEGIN (* InitMenu *)
remKey:=NIL;
IF HIGH(mRcs) > -1 THEN
AllocRemember(remKey,menuPtr1,SIZE(menuPtr1^));
firstMenu:=menuPtr1
ELSE
firstMenu:=NIL
END;
FOR j:=0 TO HIGH(mRcs) DO
InitItems(firstItemPtr);
WITH menuPtr1^ DO
IF j < HIGH(mRcs) THEN
AllocRemember(remKey,menuPtr2,SIZE(menuPtr2^));
nextMenu:=menuPtr2
ELSE
nextMenu:=NIL
END;
leftEdge:=j*charWidth*MenunamenLaenge;
topEdge:=0;
width:=charWidth*MenunamenLaenge;
height:=charHeight+2;
flags:=BITSET{menuEnabled};
firstItem:=firstItemPtr;
AllocRemember(remKey,menuName,SIZE(Menuname));
CopyMem(ADR (mRcs[j].mname),menuName,SIZE(Menuname));
END;
menuPtr1:=menuPtr2;
END;
END InitMenu;
PROCEDURE FreeMenu(VAR remKey:RememberNodePtr);
BEGIN
FreeRemember(remKey);
END FreeMenu;
PROCEDURE MenuNum(code:CARDINAL):CARDINAL;
BEGIN
RETURN code MOD 32
END MenuNum;
PROCEDURE ItemNum(code:CARDINAL):CARDINAL;
BEGIN
RETURN (code DIV 32) MOD 64
END ItemNum;
PROCEDURE SubNum(code:CARDINAL):CARDINAL;
BEGIN
RETURN ((code DIV 32) DIV 64) MOD 32
END SubNum;
BEGIN
CharSize(charWidth,charHeight);
END MakeMenu.mod